iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-刷題不只是刷題

圖解LeetCode(入門篇)系列 第 7

圖解LeetCode(入門篇): 26. Remove Duplicates from Sorted Array

  • 分享至 

  • xImage
  •  

26. Remove Duplicates from Sorted Array

題目描述:

給定一個升序排列的陣列 nums,你需要原地刪除其中重複出現的元素,使得每個元素只出現一次,並返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列,並在使用 O(1) 額外空間的條件下完成。
Example :

  • Input: nums = [0,0,1,1,1,2,2,3,3,4]
  • Output: 5, nums = [0,1,2,3,4,_,_,_,_,_]
  • Explanation: 你的函數應返回 k = 5,其中 nums 的前五個元素分別為 0, 1, 2, 3, 4。返回的 k 之後的元素無需考慮,因此用下劃線表示。

解題思路:
當我們在題目中看到 原地(in-place)更新 array 這個關鍵字時,通常可以聯想到使用「雙指針」(Two Pointers)策略來解決問題。具體步驟如下:首先,初始化兩個指針,i 初始化為 0,j 初始化為 1,然後使用 j 來遍歷整個 array。由於題目中的陣列是已排序的(Sorted Array),每當 j 指針指向的元素與 i 指針指向的元素不同時,說明我們找到了新的不重複元素。此時,將 i 指針前移一位,並將新元素放入 i 指針的新位置。遍歷完成後,返回 i + 1,這個值代表去重後陣列的最終長度。
https://ithelp.ithome.com.tw/upload/images/20240817/20168306V7MwuNziAd.jpg

var removeDuplicates = function(nums) {
    if (nums.length === 0) return 0;

    let i = 0;

    for (let j = 1; j < nums.length; j++) {
        if (nums[i] !== nums[j]) {
            i++;
            nums[i] = nums[j];
        }
    }

    return i + 1;
};

時間複雜度:O(n),其中 n 是陣列的長度。我們需要遍歷每個元素一次。
空間複雜度:O(1),我們只使用了常數空間來存儲指針,沒有使用額外的存儲空間。

總結:
這道題目可以歸類為「Two Pointers」。透過快慢指針的應用,我們能夠在原地更新 array,既避免了額外空間的浪費,同時也保持了高效的時間複雜度。這種技巧不僅在 LeetCode 解題中經常出現,在日常工作中同樣具有廣泛應用場景。掌握 Two Pointers 技巧,能夠讓我們更靈活地處理各種需要同時操作多個數據位置的問題,是一個極其實用的工具。


上一篇
圖解LeetCode(入門篇): 21. Merge Two Sorted Lists
下一篇
圖解LeetCode(入門篇): 27. Remove Element
系列文
圖解LeetCode(入門篇)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言